Dynamic Query Filtering হল Hibernate-এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে রানটাইমে কুয়েরি তৈরি করতে সহায়তা করে, যেখানে কুয়েরি শর্তগুলো ডায়নামিকভাবে নির্ধারিত হয়। এটি খুবই উপকারী যখন আপনাকে একটি ফিল্টারেবল কুয়েরি তৈরি করতে হয়, যার মধ্যে শর্তগুলি ব্যবহারকারীর ইনপুট বা অন্যান্য প্রোগ্রাম্যাটিক কন্ডিশনের ভিত্তিতে পরিবর্তিত হয়।
Hibernate-এ ডাইনামিক কুয়েরি তৈরি করার জন্য মূলত HQL (Hibernate Query Language), Criteria API, এবং JPQL (Java Persistence Query Language) ব্যবহার করা হয়।
এখানে, আমরা Hibernate এ ডাইনামিক কুয়েরি ফিল্টারিংয়ের বিভিন্ন পদ্ধতি আলোচনা করব।
HQL (Hibernate Query Language) হল Hibernate-এর নিজস্ব কুয়েরি ভাষা যা Java objects এবং relationships উপর ভিত্তি করে কুয়েরি তৈরি করে, SQL নয়। HQL ব্যবহার করে আপনি ডাইনামিকভাবে কুয়েরি তৈরি করতে পারেন।
ধরা যাক, আমাদের একটি Employee ক্লাস আছে, এবং আমরা সেই কুয়েরি তৈরি করতে চাই যা ব্যবহারকারীর ইনপুট অনুযায়ী name এবং salary ফিল্টার করবে।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
public class DynamicHQLExample {
public static void main(String[] args) {
// Hibernate configuration and session factory setup
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Get the filter criteria from the user (e.g., name and salary)
String nameFilter = "John"; // Example filter
Double salaryFilter = 50000.0; // Example filter
// Create dynamic HQL query with filter parameters
String hql = "FROM Employee WHERE name LIKE :name AND salary > :salary";
// Start a transaction
session.beginTransaction();
// Create a query with parameters
Query<Employee> query = session.createQuery(hql, Employee.class);
query.setParameter("name", "%" + nameFilter + "%"); // Use LIKE for partial match
query.setParameter("salary", salaryFilter);
// Execute the query and get the results
List<Employee> employees = query.getResultList();
// Display the result
for (Employee employee : employees) {
System.out.println(employee);
}
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
query.setParameter("name", "%" + nameFilter + "%")
এভাবে partial match (LIKE) ব্যবহার করা হয়েছে।query.setParameter("salary", salaryFilter)
দিয়ে salary এর উপর শর্ত দেওয়া হয়েছে।Hibernate এর Criteria API আপনাকে Java objects ব্যবহার করে কুয়েরি তৈরি করতে সহায়তা করে, এবং এটি টাইপ সেফ (type-safe) হয়, যার মাধ্যমে কুয়েরি তৈরির সময় কম্পাইল টাইমে ত্রুটি সনাক্ত করা সম্ভব। Criteria API-তে ডাইনামিক কুয়েরি তৈরি করার জন্য, আপনাকে Restrictions ব্যবহার করে শর্তগুলো নির্ধারণ করতে হয়।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import java.util.List;
public class DynamicCriteriaExample {
public static void main(String[] args) {
// Hibernate configuration and session factory setup
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Get the filter criteria from the user (e.g., name and salary)
String nameFilter = "John"; // Example filter
Double salaryFilter = 50000.0; // Example filter
// Start a transaction
session.beginTransaction();
// Create a Criteria object for the Employee class
org.hibernate.Criteria criteria = session.createCriteria(Employee.class);
// Add dynamic filters based on user input
criteria.add(Restrictions.like("name", "%" + nameFilter + "%")); // Like filter for name
criteria.add(Restrictions.gt("salary", salaryFilter)); // Greater than filter for salary
// Execute the query and get the results
List<Employee> employees = criteria.list();
// Display the result
for (Employee employee : employees) {
System.out.println(employee);
}
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
session.createCriteria(Employee.class)
ব্যবহার করে Criteria অবজেক্ট তৈরি করা হয়েছে।Restrictions.like("name", "%" + nameFilter + "%")
দিয়ে partial match (LIKE) ফিল্টার করা হয়েছে।Restrictions.gt("salary", salaryFilter)
দিয়ে salary এর উপর greater than শর্ত যোগ করা হয়েছে।JPQL হল JPA এর জন্য ডিফাইন করা কুয়েরি ভাষা যা Hibernate দ্বারা সমর্থিত। JPQL মূলত SQL এর মতো হলেও এটি Java objects এবং তাদের properties এর উপর ভিত্তি করে কাজ করে। JPQL এও ডাইনামিক কুয়েরি তৈরি করা সম্ভব।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
public class DynamicJPQLExample {
public static void main(String[] args) {
// Hibernate configuration and session factory setup
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Get the filter criteria from the user (e.g., name and salary)
String nameFilter = "John"; // Example filter
Double salaryFilter = 50000.0; // Example filter
// Create dynamic JPQL query with filter parameters
String jpql = "SELECT e FROM Employee e WHERE e.name LIKE :name AND e.salary > :salary";
// Start a transaction
session.beginTransaction();
// Create a query with parameters
Query<Employee> query = session.createQuery(jpql, Employee.class);
query.setParameter("name", "%" + nameFilter + "%"); // Use LIKE for partial match
query.setParameter("salary", salaryFilter);
// Execute the query and get the results
List<Employee> employees = query.getResultList();
// Display the result
for (Employee employee : employees) {
System.out.println(employee);
}
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
SELECT e FROM Employee e WHERE e.name LIKE :name AND e.salary > :salary
কুয়েরি তৈরি করা হয়েছে।query.setParameter("name", "%" + nameFilter + "%")
এবং query.setParameter("salary", salaryFilter)
এর মাধ্যমে ডাইনামিকভাবে LIKE এবং salary এর ফিল্টারিং করা হয়েছে।AND
, OR
, LIKE
, BETWEEN
, IN
ইত্যাদি।Hibernate-এ Dynamic Query Filtering আপনাকে ডেটাবেসের উপর কাস্টম এবং ডাইনামিক কুয়েরি তৈরি করতে সহায়তা করে। Hibernate Query Language (HQL), Criteria API এবং JPQL ব্যবহার করে আপনি সহজেই ফিল্টারশনের জন্য কুয়েরি তৈরি করতে পারেন, যা ডেটা খোঁজা, বিশ্লেষণ বা প্রক্রিয়াকরণের ক্ষেত্রে কার্যকরী হতে পারে। এই ধরনের কুয়েরি ফিল্টারিং আপনাকে flexibility, performance optimization, এবং advanced query construction প্রদান করে, যা বড় অ্যাপ্লিকেশনগুলির জন্য খুবই উপকারী।
Read more